package com.star.system.controller;

import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.star.core.base.BaseController;
import com.star.system.dto.*;
import com.star.security.annotations.Authorize;
import com.star.system.service.UserService;
import com.star.system.vo.LoginInfoVO;
import com.star.system.vo.UserPageVO;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 用户
 *
 * @author yangzj
 */
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {

    @Autowired
    private UserService userService;

    /**
     * 保存
     *
     * @param dto dto
     */
    @Authorize("user:save")
    @PostMapping
    public void save(@Validated @RequestBody UserSaveDTO dto) {
        userService.save(dto);
    }

    /**
     * 更新
     *
     * @param dto dto
     */
    @Authorize("user:update")
    @PutMapping
    public void update(@Validated @RequestBody UserUpdateDTO dto) {
        Assert.notNull(dto.getId(), "id不能为空");
        userService.update(dto, true);
    }

    /**
     * 更新自己的用户信息
     *
     * @param dto dto
     */
    @PutMapping("/self")
    public void updateSelf(@Validated @RequestBody UserUpdateDTO dto) {
        dto.setId(this.getUserId()).setPassword(null);
        userService.update(dto, false);
    }

    /**
     * 更新启用
     *
     * @param id      id
     * @param enabled 启用（0禁用 1启用）
     */
    @Authorize("user:update")
    @PutMapping("/enabled")
    public void updateEnabled(@RequestParam Long id, @RequestParam boolean enabled) {
        userService.updateEnabled(id, enabled);
    }

    /**
     * 更新密码
     *
     * @param dto dto
     */
    @PutMapping("/password")
    public void updatePassword(@Validated @RequestBody UpdatePasswordDTO dto) {
        userService.updatePassword(dto.setUserId(this.getUserId()));
    }

    /**
     * 首次设置密码
     *
     * @param dto dto
     */
    @PostMapping("/first-password")
    public void setFirstPassword(@Validated @RequestBody SetFirstPasswordDTO dto) {
        userService.setFirstPassword(dto.setUserId(this.getUserId()));
    }

    /**
     * 删除
     *
     * @param ids id
     */
    @Authorize("user:cancelNewsCollect")
    @DeleteMapping
    public void deleteByIds(@RequestBody List<Long> ids) {
        userService.deleteByIds(ids);
    }

    /**
     * 分页
     *
     * @param dto dto
     * @return {@link IPage}<{@link UserPageVO}>
     */
    @Authorize("user:page")
    @PostMapping("/page")
    public IPage<UserPageVO> page(@RequestBody UserPageDTO dto) {
        return userService.page(dto);
    }

    //-------------------- 以下微信小程序接口 --------------------

    /**
     * 更新用户信息-微信小程序
     *
     * @param dto dto
     */
    @Authorize("wxuser")
    @PutMapping("/wxapp")
    public void updateWxappUser(@RequestBody UserUpdateWxappDTO dto) {
        userService.updateWxappUser(dto.setId(this.getUserId()));
    }

    /**
     * 更新用户电话-微信小程序
     *
     * @param code 代码
     */
    @Authorize("wxuser")
    @PutMapping("/wxapp/phone")
    public void updateWxappPhone(@RequestParam("code") String code, @RequestParam("type") Integer type) {
        userService.updateWxappPhone(this.getUserId(), code, type);
    }

    /**
     * 更新喜欢风格-微信小程序
     *
     * @param styles 样式
     */
    @PutMapping("/wxapp/styles")
    public void updateWxappStyles(@RequestParam("styles") String styles) {
        userService.updateWxappStyles(styles, getUserId());
    }

    //-------------------- 以下通用接口 --------------------

    /**
     * 获取登陆用户信息-通用
     *
     * @return {@link LoginInfoVO}
     */
    @GetMapping("/login-info")
    public LoginInfoVO getLoginInfo() {
        return userService.getLoginInfo(this.getUserId());
    }

    /**
     * 获取首次访问提示-通用
     *
     * @return {@link String}
     */
    @GetMapping("/tips")
    public String getTips() {
        return userService.getTips(getUserId());
    }

    /**
     * 更新首次访问提示-通用
     *
     * @param tips 提示
     */
    @PutMapping("/tips")
    public void updateTips(@Validated @RequestBody Tips tips) {
        userService.updateTips(getUserId(), tips.getTips());
    }

    @Data
    public static class Tips {
        /**
         * 提示标识, tip1,tip2...
         */
        @NotBlank
        @Size(max = 255)
        private String tips;
    }
}
